//<FileName>Math.cpp</FileName>
//<Athor>秋日私语</Athor>
//<Date>2006.04.15</Date>
//不使用库函数自己写库函数的解决方法：
//【分析】：
//问题描述：x^y=?
//解答过程：x^y=exp{ln(x^y)}=exp{y*lnx}
//          ln(1+x)'=1/(1+x)
//          因为 1/(1+x)=1-x+x^2-x^3+...  (-1<x<1)
//          所以 ln(1+x)=ln(1+0)+x-x^2/2+x^3/3-x^4/4+...  (-1<x<1)
//
//          一般的，ln(x) (x>0)函数的计算方法：
//          ln(x)＝ln(x2×e^x1)         (x=x2*e^x1) (0<x2<1,x1是个大于等于0的整数)
//               ＝ln(x2)+x1            (0<x2<1)
//               ＝ln(1+x3)+x1          （x2＝1＋x3） (-1<x3<0)
//               对ln(1+x3)的计算可以用前面讨论的方法
//
//          一般的，exp(x)的计算方法:
//          exp(x)=1+x+x^2/2!+x^3/3!+...    (x是任意实数）
//
//算法设计：
//         计算函数ln(1+x)的值： (-1<x<1)
//         S1：初始化：sum＝x，power＝x×-x, term=power/2, n＝3
//   S1.5:当term的绝对值小于一个很小的值（如precision)时，goto S6
//         S2：累加和：sum＝sum＋term
//         S3：累乘幂：power＝power×(-x)
//   S3.5: 计算项：term＝power/n
//         S4：累加n： n＝n＋1
//         S5：goto S1.5
//         S6：算法结束，sum值为函数值
//
//
//         计算函数ln(x)的值：（x>0）
//         S1：确定x1，x2和x3的值：
//             S11：初始化x2＝x，x1＝0
//             S12：如果x2<1,goto S15
//             S13：x2＝x2/e,x1＝x1＋1
//             S14：goto S12
//             S15：x3＝x2－1
//         S2：ln(x)＝ln(1+x3)+x1
//
//         计算函数exp(x)的值：（x是任意实数）
//         S1：初始化sum＝1，term＝x，n＝2
//         S2：当term的绝对值<一个很小的值（如1e－6）时，goto S7
//         S3：sum＝sum＋term
//         S4：term＝term×x÷n
//         S5：n＝n＋1
//         S6：goto S2
//         S7：算法结束，sum值为函数值
//
//         计算函数x^y的值：（x，y为任意实数）
//         x^y=exp{ln(x^y)}=exp{y*lnx}
//
//C++源程序描述：
#include "Math.h"      //包含math类的声名（自定义数学函数库）

const double Math::precision=1e-6;     //数据运算精度
const double Math::e=2.718282;   //数学常量e值

//计算函数exp(x)的值：（x是任意实数）
double Math::exp(double x)
{
//	S1：初始化sum＝1，term＝x，n＝2
	double sum=1.0,term=x;
	int n=2;
//	S2：当term的绝对值<一个很小的值（如1e－6）时，goto S7
	while(abs(term)>precision)
	{
//	S3：sum＝sum＋term
		sum+=term;
//	S4：term＝term×x÷n
		term*=x;
		term/=n;
//	S5：n＝n＋1
		n++;
//	S6：goto S2
	}//end of while
//	S7：算法结束，sum值为函数值
	return sum;
}//end of Math::exp

//计算函数ln(x)的值：（x>0）
double Math::ln(double x)
{
//	S1：确定x1，x2和x3的值：
//		S11：初始化x2＝x，x1＝0
	double x2=x,x3;
	int x1=0;
//		S12：如果x2<1,goto S15
	while(x2>=1.0)
	{
//		S13：x2＝x2/e,x1＝x1＋1
		x2/=e; x1++;
//		S14：goto S12
	}
//		S15：x3＝x2－1
	x3=x2-1;
//	S2：ln(x)＝ln(1+x3)+x1
	return(ln1plusx(x3)+x1);
}//end of Math::ln

//计算函数x^y的值：（x，y为任意实数）
double Math::pow(double x,double y)
{
//	x^y=exp{ln(x^y)}=exp{y*lnx} 
	return(exp(y*ln(x)));
}//end of Math::pow

//计算函数ln(1+x)的值： (-1<x<1)
double Math::ln1plusx(double x)
{
//	S1：初始化：sum＝x，power＝x×-x, term=power/2, n＝3
	double sum=x,power=x*(-x),term=power/2; int n=3;
//	S1.5:当term的绝对值小于一个很小的值（如precision)时，goto S6
	while(abs(term)>=precision)
	{
//	S2：累加和：sum＝sum＋term
		sum+=term;
//	S3：累乘幂：power＝power×(-x)
		power*=-x;
//	S3.5: 计算项：term＝power/n
		term=power/n;
//	S4：累加n： n＝n＋1
		n++;
//	S5：goto S1.5
	}//end of while
//	S6：算法结束，sum值为函数值
	return sum;
}//end of Math::ln1plusx

double Math::abs(double x)
{
	return(x>=0.0?x:-x);
}

//计算x的立方根
double Math::cuberoot(double x)
{
	return Math::pow(x,1.0/3);
}

